package com.yidu.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.yidu.comment.Tools;
import com.yidu.dao.SnAuditMapper;
import com.yidu.dao.SnComInDetailMapper;
import com.yidu.dao.SnComPurDetailMapper;
import com.yidu.dao.SnComPurchaseMapper;
import com.yidu.dao.SnComSaDetailMapper;
import com.yidu.dao.SnComSalesMapper;
import com.yidu.dao.SnFiDetailMapper;
import com.yidu.dao.SnFinanceMapper;
import com.yidu.model.SnAudit;
import com.yidu.model.SnComInDetail;
import com.yidu.model.SnComInventory;
import com.yidu.model.SnComPurDetail;
import com.yidu.model.SnComPurchase;
import com.yidu.model.SnComSaDetail;
import com.yidu.model.SnComSales;
import com.yidu.model.SnFiDetail;
import com.yidu.model.SnFinance;
import com.yidu.model.SnUser;
import com.yidu.service.FinanceSalesService;

@Service
public class FinanceSalesServiceImpl implements FinanceSalesService{
	/**
	 * 注入财务详情表
	 */
	@Resource
	SnFiDetailMapper sfdm;
	/**
	 * 退货表
	 */
	@Resource
	SnComSalesMapper scsm;
	/**
	 * 注入采购表
	 */
	@Resource
	SnComPurchaseMapper scpm;
	/**
	 * 注入审核表
	 */
	@Resource
	SnAuditMapper sam;
	/**
	 * 注入采购详情表
	 */
	@Resource
	SnComPurDetailMapper scpdm;
	/**
	 * 退货详情表
	 */
	@Resource
	SnComSaDetailMapper scsdm;
	/**
	 * 财务表
	 */
	@Resource
	SnFinanceMapper sfm;
	/**
	 * 注入库存详情表
	 */
	@Resource
	SnComInDetailMapper scidm;
	/**
	 * 退货财务审核
	 */
	@Override
	public int salesAddOrUpdate(String csId, String allId, Integer auState, String csComment,SnUser user) {
		int rows = 0;
		int rows1 = 0;
		int rows2 = 0;
		//采购总数量
		Integer number = 0; 
		//退货总数量
		Integer number2 = 0;
		//退货总金额
		Double money2 = 0.00;
		
		
		//得到审核对象
		SnAudit sa = new SnAudit();
		//审核id
		sa.setAuId(Tools.getDateOrderNo());
		//业务id
		sa.setAllId(allId);
		//审核时间
		sa.setOptime(Tools.getTimeStr(new Date()));
		//审核人
		sa.setOper(user.getUserName());
		//审核部门
		sa.setAuComment("退货财务");
		//审核状态
		sa.setAuState(auState);
		//审核意见
		sa.setAuIdea(csComment);
		//增加审核表
		sam.insertSelective(sa);
		//审核不通过
		if(auState==0) {
			//得到退货对象
			SnComSales scs = new SnComSales();
			//退货id
			scs.setCsId(csId);
			//退货状态
			scs.setCsState(5);
			//修改退货表
			rows2 = scsm.updateByPrimaryKeySelective(scs);
			
			//通过采购id查询详情表
			List<SnComPurDetail> list = scpdm.findDetailBypurId(allId);
			//遍历采购详情表
			for (SnComPurDetail snComPurDetail : list) {
				//采购总数量
				number+=snComPurDetail.getPdNumber();
				//通过退货id查询退货详情表
				List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
				//遍历退货详情表
				for (SnComSaDetail snComSaDetail : list2) {
					//采购详情表的商品id与退货详情表的商品id相同
					if(snComPurDetail.getComId().equals(snComSaDetail.getOper())) {
						//退货总数量
						number2+=snComSaDetail.getSdCount();
						//退货总金额
						money2+=snComSaDetail.getSdCount()*snComPurDetail.getPdMoney().doubleValue();
						//得到采购详情表对象
						SnComPurDetail scpd = new SnComPurDetail();
						//给采购详情的数量赋值
						scpd.setPdNumber(snComPurDetail.getPdNumber()+snComSaDetail.getSdCount());
						//给采购详情的商品id赋值
						scpd.setComId(snComSaDetail.getOper());
						//给采购详情表的采购id赋值
						scpd.setPurId(allId);
						//得到总金额
						Double f = (snComPurDetail.getPdNumber().doubleValue()+Double.valueOf(snComSaDetail.getSdCount()))*snComPurDetail.getPdMoney().intValue();
						//采购详情表的总金额赋值
						scpd.setPdSum(BigDecimal.valueOf(f));
						//修改采购详情表
						rows = scpdm.findBypdNumber(scpd);
					}
				}
			}
			//通过业务id查询采购表
			SnComPurchase sum = scpm.selectByPrimaryKey(allId);
			//得到采购表对象
			SnComPurchase scp = new SnComPurchase();
			//给采购表采购id赋值
			scp.setPurId(allId);
			
			
			//采购金额
			scp.setPurSum(BigDecimal.valueOf(money2).add(sum.getPurSum()));
			//采购数量
			scp.setPurCount(number2+number);
			//采购isva赋值
			scp.setIsva(22);
			//修改采购表 
			scpm.updateByPrimaryKeySelective(scp);
		}else {   //审核同意
			//通过采购id查询详情表
			List<SnComPurDetail> list = scpdm.findDetailBypurId(allId);
			//遍历采购详情表
			for (SnComPurDetail snComPurDetail : list) {
				//通过业务id查询退货详情表的集合
				List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
				//遍历退货详情表
				for (SnComSaDetail snComSaDetail : list2) {
					//遍历得到总金额
					money2+=snComSaDetail.getSdCount()*snComPurDetail.getPdMoney().doubleValue();
				}
			}
			
			//通过业务id查询退货表分公司id
			SnComSales sales = scsm.findAllId(allId);
			
			//查询分公司财务
			SnFinance sf = sfm.selectBraId(sales.getBraId());
			if(money2>sf.getFinMoney().doubleValue()) {  //退货金额大于本公司资金
				return 2;
			}else if(money2<20) {	//退货金额小于一定值时，就财务审核就可以
				//得到退货对象
				SnComSales scs = new SnComSales();
				//退货id赋值
				scs.setCsId(csId);
				//退货状态赋值
				scs.setCsState(6);
				//修改退货表
				rows2 = scsm.updateByPrimaryKeySelective(scs);
				
				//同意修改总公司财务增加
				Map<String,Object> map = new HashMap<>();
				//获取总公司id
				map.put("id", user.getBraId());
				//获取总金额
				map.put("sum", money2);
				//修改总公司财务金额(增加)
				sfm.updateById(map);
				
				//通过本公司查询本公司财务表的id
				SnFinance finid = sfm.findByFinId(user.getBraId());
				//得到财务详情表
				SnFiDetail sfd = new SnFiDetail();
				//采购详情id
				sfd.setFdId(Tools.getDateOrderNo());
				//财务id   总公司
				sfd.setFinId(finid.getFinId());
				//金额
				sfd.setFdMoney(BigDecimal.valueOf(money2));
				//支出用途
				sfd.setFdExplain("总公司经理退货审核通过减少财务金额"+money2+"元");
				sfd.setIsva(1);
				//时间
				sfd.setOptime(Tools.getTimeStr(new Date()));
				//通过财务id增加一条总公司财务详情表
				sfdm.insertSelective(sfd);
				
				
				
				Map<String,Object> map2 = new HashMap<>();
				//通过业务id查询退货表
				SnComSales bra = scsm.findAllId(allId);
				//公司id
				map2.put("id", bra.getBraId());
				//总金额
				map2.put("sum", money2);
				//修改分公司财务金额
				sfm.updateByForenigKey(map);
				//通过本公司查询本公司财务表的id
				SnFinance finid2 = sfm.findByFinId(user.getBraId());
				//得到财务详情表
				SnFiDetail sfd2 = new SnFiDetail();
				//采购详情id
				sfd2.setFdId(Tools.getDateOrderNo());
				//财务id
				sfd2.setFinId(finid2.getFinId());
				//金额
				sfd2.setFdMoney(BigDecimal.valueOf(money2));
				//支出用途
				sfd2.setFdExplain("采购商品退货财务金额"+money2+"元");
				sfd2.setIsva(1);
				//时间
				sfd2.setOptime(Tools.getTimeStr(new Date()));
				//通过财务id增加一条分公司财务详情表
				sfdm.insertSelective(sfd2);
				
				//通过退货id查询退货详情表
				List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
				for (SnComSaDetail snComSaDetail : list2) {
					//得到库存的对象
					SnComInventory sci = new SnComInventory();
					//得到商品数量
					sci.setCiNumber(BigDecimal.valueOf(snComSaDetail.getSdCount()));
					//得到商品id
					sci.setComId(snComSaDetail.getOper());
					//直接定义公司id
					sci.setBraId(user.getBraId());
					//减少总公司库存数量
					scpdm.updateSum(sci);
					//查询总公司库存的改变的商品的库存id
					SnComInventory sci3 = scpdm.findSum(sci);
					
					
					//得到库存详情对象
					SnComInDetail scd2 = new SnComInDetail();
					//详情表id
					scd2.setCidId(Tools.getDateOrderNo());
					//库存表id
					scd2.setCiId(sci3.getCiId());
					//库存记录说明
					scd2.setCidExplain("分公司退货总公司通过");
					//是否有效
					scd2.setIsva(1);
					//时间
					scd2.setOptime(Tools.getTimeStr(new Date()));
					//通过商品库存id增加总公司库存详情表
					scidm.insertSelective(scd2);
					
					
					//修改分公司库存数量
					scpdm.updateCent(sci);
					//查询分公司库存的改变的商品的库存id
					SnComInventory sci4 = scpdm.findCent(sci);
					
					//得到库存详情对象
					SnComInDetail scd = new SnComInDetail();
					//详情表id
					scd.setCidId(Tools.getDateOrderNo());
					//库存表id
					scd.setCiId(sci4.getCiId());
					//库存记录说明
					scd.setCidExplain("分公司采购");
					//是否有效
					scd.setIsva(1);
					//时间
					scd.setOptime(Tools.getTimeStr(new Date()));
					//库存详情操作人
					scd.setOper(user.getUserName());
					//通过商品库存id增加分公司库存详情表
					rows1 = scidm.insertSelective(scd);
				}
			}else {	//退货金额大于一定值时，就要经理审核
				//得到退货对象
				SnComSales scs = new SnComSales();
				//退货id
				scs.setCsId(csId);
				//状态
				scs.setCsState(1);
				//修改退货表
				rows2 = scsm.updateByPrimaryKeySelective(scs);
			}
		}
		if(rows>0 || rows1>0 || rows2>0) {
			return 0;
		}else {
			return 1;
		}
	}
	/**
	 * 退货经理审核
	 */
	@Override
	public int salesManagerAddOrUpdate(String csId, String allId, Integer auState, String csComment, SnUser user) {
		
		
		int rows = 0;
		int rows1 = 0;
		//采购总数量
		Integer number = 0; 
		//退货总数量
		Integer number2 = 0;
		//退货总金额
		Double money2 = 0.00;
		
		
		//得到审核对象
		SnAudit sa = new SnAudit();
		//审核id
		sa.setAuId(Tools.getDateOrderNo());
		//业务id
		sa.setAllId(allId);
		//审核时间
		sa.setOptime(Tools.getTimeStr(new Date()));
		//审核人
		sa.setOper(user.getUserName());
		//审核部门
		sa.setAuComment("退货经理");
		//审核状态
		sa.setAuState(auState);
		//审核意见
		sa.setAuIdea(csComment);
		//增加审核表
		sam.insertSelective(sa);
		//审核不通过
		if(auState==0) {
			//得到退货对象
			SnComSales scs = new SnComSales();
			//退货id
			scs.setCsId(csId);
			//退货状态
			scs.setCsState(2);
			//修改退货表
			scsm.updateByPrimaryKeySelective(scs);
			
			
			//通过采购id查询详情表
			List<SnComPurDetail> list = scpdm.findDetailBypurId(allId);
			//遍历采购详情表
			for (SnComPurDetail snComPurDetail : list) {
				//总数量
				number+=snComPurDetail.getPdNumber();
				//通过退货id查询退货详情表
				List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
				//遍历退货详情表
				for (SnComSaDetail snComSaDetail : list2) {
					//采购详情表商品id与退货详情表商品id一样
					if(snComPurDetail.getComId().equals(snComSaDetail.getOper())) {
						//总数量
						number2+=snComSaDetail.getSdCount();
						//总金额
						money2+=snComSaDetail.getSdCount()*snComPurDetail.getPdMoney().doubleValue();
						//得到采购详情表对象
						SnComPurDetail scpd = new SnComPurDetail();
						//采购详情表数量赋值
						scpd.setPdNumber(snComPurDetail.getPdNumber()+snComSaDetail.getSdCount());
						//采购详情表商品id
						scpd.setComId(snComSaDetail.getOper());
						//采购详情表的采购id赋值
						scpd.setPurId(allId);
						//总金额赋值
						Double f = (snComPurDetail.getPdNumber().doubleValue()+Double.valueOf(snComSaDetail.getSdCount()))*snComPurDetail.getPdMoney().intValue();
						//采购总金额赋值
						scpd.setPdSum(BigDecimal.valueOf(f));
						//修改采购详情表
						rows = scpdm.findBypdNumber(scpd);
					}
				}
			}
			//通过业务id查询采购表
			SnComPurchase sum = scpm.selectByPrimaryKey(allId);
			//得到采购表对象
			SnComPurchase scp = new SnComPurchase();
			//业务id赋值
			scp.setPurId(allId);
			
			
			//采购金额
			scp.setPurSum(BigDecimal.valueOf(money2).add(sum.getPurSum()));
			//采购数量
			scp.setPurCount(number2+number);
			//isva赋值
			scp.setIsva(22);
			//修改采购表 
			scpm.updateByPrimaryKeySelective(scp);
		}else {   //审核同意
			//得到退货对象
			SnComSales scs = new SnComSales();
			//退货id赋值
			scs.setCsId(csId);
			//退货状态赋值
			scs.setCsState(3);
			//修改退货表
			scsm.updateByPrimaryKeySelective(scs);
			
			//通过采购id查询详情表
			List<SnComPurDetail> list = scpdm.findDetailBypurId(allId);
			//遍历采购详情表
			for (SnComPurDetail snComPurDetail : list) {
				//通过业务id查询退货详情表
				List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
				//遍历退货详情表
				for (SnComSaDetail snComSaDetail : list2) {
					//得到总金额
					money2+=snComSaDetail.getSdCount()*snComPurDetail.getPdMoney().doubleValue();
				}
			}
			
			//同意修改总公司财务增加
			Map<String,Object> map = new HashMap<>();
			//获取总公司id
			map.put("id", user.getBraId());
			//获取总金额
			map.put("sum", money2);
			//修改总公司财务金额(增加)
			sfm.updateById(map);
			
			//通过本公司查询本公司财务表的id
			SnFinance finid = sfm.findByFinId(user.getBraId());
			//得到财务详情表
			SnFiDetail sfd = new SnFiDetail();
			//采购详情id
			sfd.setFdId(Tools.getDateOrderNo());
			//财务id   总公司
			sfd.setFinId(finid.getFinId());
			//金额
			sfd.setFdMoney(BigDecimal.valueOf(money2));
			//支出用途
			sfd.setFdExplain("总公司经理退货审核通过减少财务金额"+money2+"元");
			sfd.setIsva(1);
			//时间
			sfd.setOptime(Tools.getTimeStr(new Date()));
			//通过财务id增加一条总公司财务详情表
			sfdm.insertSelective(sfd);
			
			
			//获取map
			Map<String,Object> map2 = new HashMap<>();
			//通过业务id查询退货表
			SnComSales bra = scsm.findAllId(allId);
			//公司id
			map2.put("id", bra.getBraId());
			map2.put("sum", money2);
			//修改分公司财务金额
			sfm.updateByForenigKey(map);
			//通过本公司查询本公司财务表的id
			SnFinance finid2 = sfm.findByFinId(user.getBraId());
			//得到财务详情表
			SnFiDetail sfd2 = new SnFiDetail();
			//采购详情id
			sfd2.setFdId(Tools.getDateOrderNo());
			//财务id
			sfd2.setFinId(finid2.getFinId());
			//金额
			sfd2.setFdMoney(BigDecimal.valueOf(money2));
			//支出用途
			sfd2.setFdExplain("采购商品退货财务金额"+money2+"元");
			sfd2.setIsva(1);
			//时间
			sfd2.setOptime(Tools.getTimeStr(new Date()));
			//通过财务id增加一条分公司财务详情表
			sfdm.insertSelective(sfd2);
			
			//通过退货id查询退货详情表
			List<SnComSaDetail> list2 = scsdm.findByCsId(allId);
			//遍历退货详情表
			for (SnComSaDetail snComSaDetail : list2) {
				//得到库存的对象
				SnComInventory sci = new SnComInventory();
				//得到商品数量
				sci.setCiNumber(BigDecimal.valueOf(snComSaDetail.getSdCount()));
				//得到商品id
				sci.setComId(snComSaDetail.getOper());
				//直接定义公司id
				sci.setBraId(user.getBraId());
				//减少总公司库存数量
				scpdm.updateSum(sci);
				//查询总公司库存的改变的商品的库存id
				SnComInventory sci3 = scpdm.findSum(sci);
				
				
				//得到库存详情对象
				SnComInDetail scd2 = new SnComInDetail();
				//详情表id
				scd2.setCidId(Tools.getDateOrderNo());
				//库存表id
				scd2.setCiId(sci3.getCiId());
				//库存记录说明
				scd2.setCidExplain("分公司退货总公司通过");
				//是否有效
				scd2.setIsva(1);
				//时间
				scd2.setOptime(Tools.getTimeStr(new Date()));
				//通过商品库存id增加总公司库存详情表
				scidm.insertSelective(scd2);
				
				
				//修改分公司库存数量
				scpdm.updateCent(sci);
				//查询分公司库存的改变的商品的库存id
				SnComInventory sci4 = scpdm.findCent(sci);
				
				//得到库存详情对象
				SnComInDetail scd = new SnComInDetail();
				//详情表id
				scd.setCidId(Tools.getDateOrderNo());
				//库存表id
				scd.setCiId(sci4.getCiId());
				//库存记录说明
				scd.setCidExplain("分公司采购");
				//是否有效
				scd.setIsva(1);
				//时间
				scd.setOptime(Tools.getTimeStr(new Date()));
				//库存详情操作人
				scd.setOper(user.getUserName());
				//通过商品库存id增加分公司库存详情表
				rows1 = scidm.insertSelective(scd);
			}
			
		}
		if(rows>0 || rows1>0) {
			return 1;
		}else {
			return 0;
		}
	}

}
